iT邦幫忙

2024 iThome 鐵人賽

DAY 27
0

介紹MVP

android 寫程式時,可以用很多種分類的方法把程式分類,mvp架構是其中一種方法
這麼做的好處是更易於維護,並促進應用的可測試性、和可擴展性,常常一個改變不用全部改,可以只修改一處就好。

MVP架構分成三部分

  • View(畫面):應該保持簡單,做一些簡單的數值傳遞、宣告變數,做畫面上物件的綁定,以及宣告變數。
  • Presenter(邏輯):畫面的變數跟值傳遞過來做下一步的判斷,判斷式決定從VIEW傳遞過來數值的去處。
  • MODEL:處理數據的獲取和存儲(例如從API獲取的數據)
  • image

MVP怎麼做

這邊我練習了一個簡單的mvp架構的密碼登入程式
class先設好分三類跟一個管理介面接口的contract
image

我們創建一個class(MainContract)專門處理三個部分傳遞數值介面的接口

public interface MainContract {
    interface view {

    }
    interface presenter {

    }
    interface modle{

    }
}

介面裡放上各部分的functoin

view

使用Activity當作mvp架構中的view
public class MainActivity extends AppCompatActivity implements MainContract.view

宣告變數跟設定從presenter傳遞過來的值需要在view也設一個變數來接

  private EditText account;
    private EditText password;
    private Button  sent;
    private Context context=this;
    private MainPresenter presenter;

綁定物件

  account=(EditText)findViewById(R.id.main_account_et);
        password=(EditText) findViewById(R.id.main_password_et);
        sent=(Button) findViewById(R.id.button);

presenter=new MainPresenter( this);presenter方法設定在view的變數上

將輸入的帳號密碼傳給presnter

 public void sentOnClick(View view){
        presenter.getLoginData(account.getText().toString(),password.getText().toString());
    }

presenter

接收view的值,並把自身丟到model去抓Model的帳密資料

private MainContract.view callBake;
private MainModle model;
public MainPresenter(MainContract.view view) {
        
        this.callBake=view;
        
        model = new MainModle(this);
    }

這裡我還在presenter做帳密判斷正確的function,

    @Override
    public void getLoginData(String password, String account) {
        if(password.equals("0000")&&account.equals("1111")) {
            //到Modle拿取登入人員資料。
            userName = model.getUserName();
            //再傳回view,叫view更新畫面。
            callBake.showUserName(userName);
        }
        else
            callBake.loginError();
    }
}

到model抓取帳密資料,若正確就丟回view的showUserName的function裡做顯示,若失敗就丟回view的loginError的function裡做顯示

model

因為帳號密碼在presenter就指定一組判斷了,所以這裡model只是抓presenter並傳回,並在view上的getUserName()回傳顯示

public class MainModle implements MainContract.modle {
    private MainContract.presenter callBake;
    public MainModle(MainContract.presenter presenter){
        this.callBake=presenter;
    }
    @Override
    public String getUserName(){
        return "歡迎登入";
    }
}

最後成果展示


上一篇
[day26]SharedPreferences -密碼登入歷史紀錄
下一篇
[day28]LOG
系列文
深入Android 物件的認識與應用實踐30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言